import threading


class MessageQueue:
    def __init__(self):
        # 初始化一个空列表来存储消息
        self.queue = []
        # 初始化一个锁，用于线程同步
        self.lock = threading.Lock()

    def enqueue(self, message):
        # 获取锁，确保同一时间只有一个线程可以执行入队操作
        with self.lock:
            # 入队操作，将消息添加到队列尾部
            self.queue.append(message)

    def dequeue(self):
        # 获取锁，确保同一时间只有一个线程可以执行出队操作
        with self.lock:
            # 出队操作，如果队列为空返回 None，否则移除并返回队列头部的消息
            if self.is_empty():
                return None
            return self.queue.pop(0)

    def is_empty(self):
        # 获取锁，确保同一时间只有一个线程可以检查队列是否为空
        with self.lock:
            # 检查队列是否为空
            return len(self.queue) == 0

    def size(self):
        # 获取锁，确保同一时间只有一个线程可以获取队列大小
        with self.lock:
            # 获取队列的大小
            return len(self.queue)
